#include "main.h"
#include "tim.h"
#include "scnsInclude.h"
#include "stm32f7xx_it.h"
#include "stm32f767xx.h"
#include "ftl.h"

static const ScnsTouchScreenButton mainPageButtons[]={
    {
        .key=SCNS_KEY_TOUCH_LEFT,
        .shape=SCNS_TOUCH_SCREEN_BUTTON_RECTANGLE,
        .shapeData.rectangle={.plu={.x=1024-80*3+0,.y=600-80*3+80},.w=80,.h=80},
    },
    {
        .key=SCNS_KEY_TOUCH_RIGHT,
        .shape=SCNS_TOUCH_SCREEN_BUTTON_RECTANGLE,
        .shapeData.rectangle={.plu={.x=1024-80*3+80*2,.y=600-80*3+80},.w=80,.h=80},
    },
    {
        .key=SCNS_KEY_TOUCH_UP,
        .shape=SCNS_TOUCH_SCREEN_BUTTON_RECTANGLE,
        .shapeData.rectangle={.plu={.x=1024-80*3+80,.y=600-80*3+0},.w=80,.h=80},
    },
    {
        .key=SCNS_KEY_TOUCH_DOWN,
        .shape=SCNS_TOUCH_SCREEN_BUTTON_RECTANGLE,
        .shapeData.rectangle={.plu={.x=1024-80*3+80,.y=600-80*3+80*2},.w=80,.h=80},
    },
    {
        .key=SCNS_KEY_TOUCH_CENTER,
        .shape=SCNS_TOUCH_SCREEN_BUTTON_CIRCLE,
        .shapeData.circle={.plu={.x=1024-80*3+80,.y=600-80*3+80},.r=80/2},
    },
};

void initA(void)
{
    scnsYingInit();
    scnsTimerInit();
    scnsW25qxxInit(SCNS_W25QXX_QSPI);
    scnsW25qxxEnterMemoryMapped(SCNS_W25QXX_QSPI);
}

__attribute__((noinline)) void initB(void)
{
    extern ScnsStatus tpadInit(void);
    scnsTryInitDefine();
    LL_TIM_EnableIT_UPDATE(TIM6);
    LL_TIM_EnableCounter(TIM6);
    LL_TIM_EnableIT_UPDATE(TIM7);
    LL_TIM_EnableCounter(TIM7);
    scnsTryInit(SCNS_STATUS_OK,scnsMallocInit());
    scnsTryInit(SCNS_STATUS_OK,scnsSmctpInit());
    scnsTryInit(SCNS_STATUS_OK,scnsKeyInit());
    scnsTryInit(SCNS_STATUS_OK,scnsLcdInit());
    scnsTryInit(SCNS_STATUS_OK,ftlInit());
    scnsTryInit(SCNS_STATUS_OK,scnsMenuInit());
    scnsTryInit(SCNS_STATUS_OK,scnsIwdgInit());
    scnsTryInit(SCNS_STATUS_OK,scnsLedInit(SCNS_LED_0));
    scnsTryInit(SCNS_STATUS_OK,scnsLedInit(SCNS_LED_1));
    scnsTryInit(SCNS_STATUS_OK,scnsKeyboardGpioInit());
    scnsTryInit(SCNS_STATUS_OK,tpadInit());
    scnsTryInit(SCNS_STATUS_OK,scnsRandInit());
    //scnsTryInit(SCNS_STATUS_OK,scnsBeepInit());
    scnsMenuAddFunction(0,0,ftlEraseAll);
    scnsMenuLoadAll();
    scnsBeepAdd("1");
    scnsTryInit(SCNS_STATUS_OK,scnsIicInit(SCNS_IIC_SOFT_1));
    scnsTryInit(SCNS_STATUS_OK,scnsIicInit(SCNS_IIC_SOFT_DCMI));
    scnsTryInit(SCNS_STATUS_OK,scnsIicInit(SCNS_IIC_SOFT_CT));

    scnsTryInit(SCNS_STATUS_OK,scnsSsd1306Init(SCNS_SSD1306_1));
    scnsTryInit(SCNS_STATUS_OK,scnsAt24c02Init(SCNS_AT24C02_1));
    //scnsTryInit(SCNS_STATUS_OK,scnsAt24c02Init(SCNS_AT24C02_2));
    //scnsTryInit(SCNS_STATUS_OK,scnsAt24c02Test(SCNS_AT24C02_1,0X00));
    //scnsTryInit(SCNS_STATUS_OK,scnsAt24c02Test(SCNS_AT24C02_2,0X00));
    scnsTryInit(SCNS_STATUS_OK,scnsAp3216cInit(SCNS_AP3216C_1));

    scnsTryInit(SCNS_STATUS_OK,scnsPcf8574Init(SCNS_PCF8574_1));
    //scnsTryInit(SCNS_STATUS_OK,scnsPcf8574Init(SCNS_PCF8574_2));
    //scnsTryInit(SCNS_STATUS_OK,scnsPcf8574Init(SCNS_PCF8574_3));
    scnsTryInit(SCNS_STATUS_OK,scnsTouchScreenInit());
    for(int i=0;i<(sizeof mainPageButtons)/(sizeof(mainPageButtons[0]));++i){scnsTouchScreenAddButton(&mainPageButtons[i]);}
    scnsTryInit(SCNS_STATUS_OK,scnsFt5206Init(SCNS_FT5206_1));
    scnsBeepAdd("2");
#if 1
#if defined(SCNS_WM8978_ENABLE)&&SCNS_WM8978_ENABLE==1
    scnsTryInit(SCNS_STATUS_OK,scnsWm8978Init(SCNS_WM8978_1));
    scnsWm8978TxFifoAddAndFree(SCNS_WM8978_1,scnsWavGenerate(SCNS_MALLOC_EXT,698,44100,2,16,0.5));
    scnsWm8978TxFifoAddAndFree(SCNS_WM8978_1,scnsWavGenerate(SCNS_MALLOC_EXT,784,44100,2,16,0.5));
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_TestSong,NULL);
    //scnsWm8978StartRecord(SCNS_WM8978_1,1024*32,SCNS_MALLOC_EXT,scnsWm8978TxFifoAddAndFree);
#if 0
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC262_CH1_SR8000_BI8,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC277_CH1_SR8000_BI8,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC294_CH1_SR8000_BI16,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC311_CH1_SR8000_BI16,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC330_CH1_SR8000_BI24,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC349_CH1_SR8000_BI24,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC370_CH1_SR8000_BI32,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC392_CH1_SR8000_BI32,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC415_CH2_SR8000_BI8,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC440_CH2_SR8000_BI8,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC466_CH2_SR8000_BI16,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC494_CH2_SR8000_BI16,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC523_CH2_SR8000_BI24,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC554_CH2_SR8000_BI24,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC587_CH2_SR8000_BI32,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC622_CH2_SR8000_BI32,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC659_CH1_SR16000_BI8,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC698_CH1_SR16000_BI8,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC740_CH1_SR16000_BI16,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC784_CH1_SR16000_BI16,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC831_CH1_SR16000_BI24,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC880_CH1_SR16000_BI24,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC932_CH1_SR16000_BI32,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC988_CH1_SR16000_BI32,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC1047_CH2_SR16000_BI8,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC1109_CH2_SR16000_BI8,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC1175_CH2_SR16000_BI16,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC1245_CH2_SR16000_BI16,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC1319_CH2_SR16000_BI24,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC1397_CH2_SR16000_BI24,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC1480_CH2_SR16000_BI32,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC1568_CH2_SR16000_BI32,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC1661_CH1_SR44100_BI8,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC1760_CH1_SR44100_BI8,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC1865_CH1_SR44100_BI16,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC1976_CH1_SR44100_BI16,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC2093_CH1_SR44100_BI24,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC2218_CH1_SR44100_BI24,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC2349_CH1_SR44100_BI32,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC2489_CH1_SR44100_BI32,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC2637_CH2_SR44100_BI8,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC2794_CH2_SR44100_BI8,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC2960_CH2_SR44100_BI16,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC3136_CH2_SR44100_BI16,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC3323_CH2_SR44100_BI24,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC3520_CH2_SR44100_BI24,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC3729_CH2_SR44100_BI32,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC3951_CH2_SR44100_BI32,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC262_CH1_SR96000_BI8,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC277_CH1_SR96000_BI8,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC294_CH1_SR96000_BI16,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC311_CH1_SR96000_BI16,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC330_CH1_SR96000_BI24,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC349_CH1_SR96000_BI24,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC370_CH1_SR96000_BI32,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC392_CH1_SR96000_BI32,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC415_CH2_SR96000_BI8,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC440_CH2_SR96000_BI8,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC466_CH2_SR96000_BI16,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC494_CH2_SR96000_BI16,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC523_CH2_SR96000_BI24,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC554_CH2_SR96000_BI24,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC587_CH2_SR96000_BI32,NULL);
    scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_FC622_CH2_SR96000_BI32,NULL);
    //extern const ScnsWav scnsWav_sample_12s;
    //scnsWm8978TxFifoAdd(SCNS_WM8978_1,&scnsWav_sample_12s);
#endif
#endif
#if defined(SCNS_OV7725_ENABLE)&&SCNS_OV7725_ENABLE==1
    scnsTryInit(SCNS_STATUS_OK,scnsOv7725Init(SCNS_OV7725_1));
#endif
#if defined(SCNS_OV2640_ENABLE)&&SCNS_OV2640_ENABLE==1
    scnsTryInit(SCNS_STATUS_OK,scnsOv2640Init(SCNS_OV2640_1));
#endif
#if defined(SCNS_OV5640_ENABLE)&&SCNS_OV5640_ENABLE==1
    scnsTryInit(SCNS_STATUS_OK,scnsOv5640Init(SCNS_OV5640_1));
#endif
#if defined(SCNS_GYRO_ENABLE)&&SCNS_GYRO_ENABLE==1
    scnsTryInit(SCNS_STATUS_OK,scnsGyroInit(SCNS_GYRO_1));
#endif
#if defined(SCNS_TM1638_ENABLE)&&SCNS_TM1638_ENABLE==1
    scnsTryInit(SCNS_STATUS_OK,scnsTm1638Init(SCNS_TM1638_ON_BOARD));
    scnsTryInit(SCNS_STATUS_OK,scnsTm1638Init(SCNS_TM1638_STB0));
#endif
#if defined(SCNS_DS18B20_ENABLE)&&SCNS_DS18B20_ENABLE==1
    scnsTryInit(SCNS_STATUS_OK,scnsDs18b20Init(SCNS_DS18B20_1));
    //scnsDs18b20SearchAll();
#endif
#if defined(SCNS_DHT11_ENABLE)&&SCNS_DHT11_ENABLE==1
    scnsTryInit(SCNS_STATUS_OK,scnsDht11Init(SCNS_DHT11_1));
#endif
#endif
    scnsTimerMarkInited();
    scnsLcdSetBackgroundLight(SCNS_LCD_BACKGROUND_LIGHT_ON);
    scnsBeepAdd("4");
    hxPrintfFL("Init finish %d error sysclk=%u SCB->VTOR=%#010X\n",errN,HAL_RCC_GetSysClockFreq(),SCB->VTOR);
    scnsMenuLoadAll();
    //scnsIicScan(SCNS_IIC_SOFT_1);
    //scnsIicScan(SCNS_IIC_SOFT_DCMI);
    //scnsIicScan(SCNS_IIC_SOFT_CT);
    scnsLcdDisplayInt16(SCNS_LCD_LAYER_AUTO,(Point){.x=errPlu.x,.y=errPlu.y+errN*scnsLcdFontSimSun16.fontHeight},errN,&scnsLcdFontSimSun16,SCNS_LCD_COLOR_RED,SCNS_LCD_COLOR_BACKGROUND,1);
    for(;scnsTimerGetUs()<displayUs;)
    {
        scnsIwdgFeed();
        scnsMenuFresh();
    }
    scnsBeepAdd("5");
    scnsMenuSetMode(SCNS_MENU_MODE_KEY|SCNS_MENU_MODE_SMCTP|SCNS_MENU_MODE_LCD);
#if defined(SCNS_TOUCH_SCREEN_ENABLE)&&SCNS_TOUCH_SCREEN_ENABLE==1
    scnsTouchScreenDisplayButtonAll(SCNS_LCD_LAYER_AUTO,1);
#endif
}
